#include "bootpack.h"
#define FLAGS_OVERRUN	0x0001
/* FIFO缓冲区初始化 */
/***********************************************************************************************
*函数参数 : fifo-指向fifo缓存区结构体实例  size-缓存区大小 buf-指向缓存 
***********************************************************************************************/
void fifo8_init(struct FIFO8 *fifo, int size, unsigned char *buf)

{
	fifo->size = size;
	fifo->buf = buf;
	fifo->free = size; /* 空的 */
	fifo->flags = 0;
	fifo->p = 0; /* 存入位置 */
	fifo->q = 0; /* 读取位置 */
	return;
}
/* FIFO送入缓存*/
/***********************************************************************************************
*函数参数 : fifo-指向fifo缓存区结构体实例  data-需要存入的数据
***********************************************************************************************/
int fifo8_put(struct FIFO8 *fifo, unsigned char data)

{
	if (fifo->free == 0) {
		/*如果缓存区满了*/
		fifo->flags |= FLAGS_OVERRUN;
		return -1;
	}
	fifo->buf[fifo->p] = data;
	fifo->p++;
	if (fifo->p == fifo->size) {
		fifo->p = 0;
	}
	fifo->free--;
	return 0;
}
/* FIFO从缓存区获取数据*/
/***********************************************************************************************
*函数参数 : fifo-指向fifo缓存区结构体实例  
***********************************************************************************************/
int fifo8_get(struct FIFO8 *fifo)

{
	int data;
	if (fifo->free == fifo->size) {
		/* 如果缓存区空了 */
		return -1;
	}
	data = fifo->buf[fifo->q];
	fifo->q++;
	if (fifo->q == fifo->size) {
		fifo->q = 0;
	}
	fifo->free++;
	return data;
}
/* 获取FIFO缓存区状态 */
/***********************************************************************************************
*函数参数 : fifo-指向fifo缓存区结构体实例  
***********************************************************************************************/
int fifo8_status(struct FIFO8 *fifo)

{
	return fifo->size - fifo->free;
}
